/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package File类;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @Description File类
 *   java.io.File类：文件和文件目录路径的抽象表示形式，与平台无关
 *  File 能新建、删除、重命名文件和目录，但 File 不能访问文件内容本身。
 *      如果需要访问文件内容本身，则需要使用输入/输出流。
 *  想要在Java程序中表示一个真实存在的文件或目录，那么必须有一个File对
 *      象，但是Java程序中的一个File对象，可能没有一个真实存在的文件或目录。
 *  File对象可以作为参数传递给流的构造器
 *
 *       public File(String pathname)
 *          以pathname为路径创建File对象，可以是绝对路径或者相对路径，如果
 *          pathname是相对路径，则默认的当前路径在系统属性user.dir中存储。
 *           绝对路径：是一个固定的路径,从盘符开始
 *           相对路径：是相对于某个位置开始
 *
 *      public File(String parent,String child)
 *          以parent为父路径，child为子路径创建File对象。
 *
 *      public File(File parent,String child)
 *          根据一个父File对象和子文件路径创建File对象
 *
 *      路径中的每级目录之间用一个路径分隔符隔开。
 *      路径分隔符和系统有关：
 *       windows和DOS系统默认使用“\”来表示
 *       UNIX和URL使用“/”来表示
 *      Java程序支持跨平台运行，因此路径分隔符要慎用。
 *      为了解决这个隐患，File类提供了一个常量：
 *       public static final String separator。根据操作系统，动态的提供分隔符。
 *
 *       File类的获取功能
 *       public String getAbsolutePath()：获取绝对路径
 *       public String getPath() ：获取路径
 *       public String getName() ：获取名称
 *       public String getParent()：获取上层文件目录路径。若无，返回null
 *       public long length() ：获取文件长度（即：字节数）。不能获取目录的长度。
 *       public long lastModified() ：获取最后一次的修改时间，毫秒值
 *       public String[] list() ：获取指定目录下的所有文件或者文件目录的名称数组
 *       public File[] listFiles() ：获取指定目录下的所有文件或者文件目录的File数组
 *
 *       File类的重命名功能
 *       public boolean renameTo(File dest):把文件重命名为指定的文件路径
 *
 *       File类的判断功能
 *       public boolean isDirectory()：判断是否是文件目录
 *       public boolean isFile() ：判断是否是文件
 *       public boolean exists() ：判断是否存在
 *       public boolean canRead() ：判断是否可读
 *       public boolean canWrite() ：判断是否可写
 *       public boolean isHidden() ：判断是否隐藏
 *
 *       File类的创建功能
 *       public boolean createNewFile() ：创建文件。若文件存在，则不创建，返回false
 *       public boolean mkdir() ：创建文件目录。如果此文件目录存在，就不创建了。
 *          如果此文件目录的上层目录不存在，也不创建。
 *       public boolean mkdirs() ：创建文件目录。如果上层文件目录不存在，一并创建
 *          注意事项：如果你创建文件或者文件目录没有写盘符路径，那么，默认在项目
 *          路径下。
 *
 *      
 *      File 类的删除功能
 *      public boolean delete 删除 文件或者文件夹
 *      删除注意事项：Java中的删除不走 回收站 。要删除一个 文件 目录
 *      请注意该 文件 目录 内 不能包含文件或者 文件 目录
 *
 *
 * @Author 俊昭
 * @Date 2022/4/22
 */
public class FileTest {
    /*
    常用方法 判断 创建
     */
    @Test
    public void FT03(){
        File file1 = new File("Hello.txt");// 相对路径
        File file2 = new File("C:\\Users\\Junzhao\\IOStream");// 绝对路径
        File file3 = new File("C:\\Users\\Junzhao\\IdeaProjects\\尚硅谷\\高级\\IO流\\.idea");// 绝对路径
                                                // 第一次执行    第二次执行
        // public boolean isDirectory()：判断是否是文件目录
        System.out.println(file1.isDirectory());//f     f
        System.out.println(file2.isDirectory());//t     t
        System.out.println(file3.isDirectory());//t     t
        System.out.println();

        // public boolean isFile() ：判断是否是文件
        System.out.println(file1.isFile());//f      t
        System.out.println(file2.isFile());//f      f
        System.out.println(file3.isFile());//f      f
        System.out.println();

        // public boolean exists() ：判断是否存在
        System.out.println(file1.exists());//f      t
        System.out.println(file2.exists());//t      t
        System.out.println(file3.exists());//t      t
        System.out.println();

        // public boolean canRead() ：判断是否可读
        System.out.println(file1.canRead());//f     t
        System.out.println(file2.canRead());//t     t
        System.out.println(file3.canRead());//t     t
        System.out.println();

        // public boolean canWrite() ：判断是否可写
        System.out.println(file1.canWrite());//f    t
        System.out.println(file2.canWrite());//t    t
        System.out.println(file3.canWrite());//t    t
        System.out.println();

        // public boolean isHidden() ：判断是否隐藏
        System.out.println(file1.isHidden());//f    f
        System.out.println(file2.isHidden());//f    f
        System.out.println(file3.isHidden());//f    f
        System.out.println();

        // public boolean createNewFile() ：创建文件。若文件存在，则不创建，返回false
        try {
            System.out.println(file1.createNewFile());// t      f
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            System.out.println(file2.createNewFile());// f      f
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            System.out.println(file3.createNewFile());// f      f
        } catch (IOException e) {
            e.printStackTrace();
        }

        // public boolean mkdir() ：创建文件目录。如果此文件目录存在，就不创建了。
        // 如果此文件目录的上层目录不存在，也不创建。


    }

    /*
    常用方法 获取
     */
    @Test
    public void FT02(){
        File file1 = new File("Hello.txt");// 相对路径
        File file2 = new File("C:\\Users\\Junzhao\\IOStream\\he.txt");// 绝对路径

        String s1 = null;
        String s2 = null;

        // public String getAbsolutePath()：获取绝对路径
        s1 = file1.getAbsolutePath();
        s2 = file2.getAbsolutePath();
        System.out.println(s1);// C:\Users\Junzhao\IdeaProjects\尚硅谷\高级\IO流\Hello.txt
        System.out.println(s2);// C:\Users\Junzhao\IOStream\he.txt

        // public String getPath() ：获取路径
        s1 = file1.getPath();
        s2 = file2.getPath();
        System.out.println(s1);// Hello.txt
        System.out.println(s2);// C:\Users\Junzhao\IOStream\he.txt

        // public String getName() ：获取名称
        s1 = file1.getName();
        s2 = file2.getName();
        System.out.println(s1);// Hello.txt
        System.out.println(s2);// he.txt

        // public String getParent()：获取 上层文件 目录路径。若无，返回null
        s1 = file1.getParent();
        s2 = file2.getParent();
        System.out.println(s1);// null
        System.out.println(s2);// C:\Users\Junzhao\IOStream

        // public long length() ：获取文件长度（即：字节数）。不能获取目录的长度
        System.out.println(file1.length());// 12
        System.out.println(file2.length());// 0

        // public long lastModified() ：获取最后一次的修改时间，毫秒值可以通过SDF类转换
        long l = file2.lastModified();
        long l1 = file1.lastModified();
        System.out.println();// 1650631311369
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(simpleDateFormat.format(new Date(l)));// 2022-04-22 08:41:51
        System.out.println(simpleDateFormat.format(new Date(l1)));// 2022-04-22 10:44:18


        // public String[] list() ：获取指定目录下的所有文件或者文件目录的名称数组
        File file3 = new File("C:\\Users\\Junzhao\\IdeaProjects\\尚硅谷\\高级\\IO流");
        String[] fileName = file3.list();
        System.out.println(Arrays.toString(fileName));// [.idea, IO流.iml, out, src]

        // public File[] listFiles() ：获取指定目录下的所有文件或者文件目录的File数组
        File[] files = file3.listFiles();
        System.out.println(Arrays.toString(files));
        //[C:\Users\Junzhao\IdeaProjects\尚硅谷\高级\IO流\.idea,
        // C:\Users\Junzhao\IdeaProjects\尚硅谷\高级\IO流\IO流.iml,
        // C:\Users\Junzhao\IdeaProjects\尚硅谷\高级\IO流\out,
        // C:\Users\Junzhao\IdeaProjects\尚硅谷\高级\IO流\src]


    }

    @Test
    public void FT01(){
        // public File(String pathname)
        // 通过将给定的路径名字符串转换为抽象路径名来创建一个新的File实例。
        // 如果给定的字符串是空字符串，那么结果就是空的抽象路径名。
        File file0 = new File("Hello.txt");// 相对路径
        File file1 = new File("C:\\Users\\Junzhao\\IOStream\\he.txt");// 绝对路径

        System.out.println(file0);// Hello.txt
        System.out.println(file1);// C:\Users\Junzhao\IOStream\he.txt

        // public File(File parent,String child)
        // 从父路径名字符串和子路径名字符串中创建一个新的File实例。
        // 如果parent为空，则通过调用给定子路径名字符串上的单参数File构造函数来创建新的File实例。
        File file3 = new File("\\IO流","HI");

        System.out.println(file3);// \IO流\HI

        // public File(File parent,String child)
        // 根据一个父File对象和子文件路径创建File对象
        File file4 = new File(file3,"ABC");
        System.out.println(file4);// \IO流\HI\ABC 意思是file3目录下再一个ABC

        // 以上只是内存层面的对象 不涉及硬盘内文件创建


        try {
            file1.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
